package com.zjw.forum.utils;


import org.springframework.util.DigestUtils;

public class MD5Util {
    //盐值 每次服务器重新启动才会改变
    private static final String SALT=UUIDUtil.createSalt();

    //对字符串进行md5加密
    public static String md5Encryption(String str){
        return DigestUtils.md5DigestAsHex(str.getBytes());
    }

    /**
     * 明文加密=密文 、密文+盐值 再存储在数据库中
     * @param str
     * @return
     */
    //加盐后进行MD5加密
    public static String md5SaltEncryption(String str){
        //明文加密
        String s = MD5Util.md5Encryption(str);
        //拼接 密文加盐值
        StringBuilder stringBuilder=new StringBuilder(s);
        stringBuilder.append(SALT);
        return stringBuilder.toString();
    }

    /**
     *
     * @param str1 待校验
     * @param str2 待比较(从数据库获取的)
     * @return
     */
    //校验是否正确（不加盐的）
    public static Boolean md5Verify(String str1,String str2){
        //普通MD5校验（不加盐的）
        String s = MD5Util.md5Encryption(str1);
        if(s.equals(str2)){
            return true;
        }
        return false;
    }

    /**
     *由于是加盐版：数据库存储的是盐和密文拼接的结果 共64位
     * @param str1 待校验
     * @param str2 待比较(从数据库获取的)
     * @return
     */
    //校验是否正确（加盐版） 校验时要和之前存放的盐值相同才能校验
    public static Boolean md5SaltVerify(String str1,String str2){
        //先对储存的结果进行分割 取后32位 得到盐
        String salt = str2.substring(32, 64);

        //对明文加密
        String tmp = MD5Util.md5Encryption(str1);
        //拼接方式：密文+盐
        StringBuilder str=new StringBuilder(tmp);
        str.append(salt);
        System.out.println(str);
        //比较是否相同
        if(str.toString().equals(str2)){
            return true;
        }
        return false;
    }
}
